<?php
//分类模型
class CategoryModel extends Model{
	//获取所有的商品分类
	public function getCats(){
		$sql = "SELECT * FROM {$this->table}";
		$cats = $this->db->getAll($sql);
		return $this->tree($cats);
	}

	/**
	 * 重新排序
	 * @param  array  $arr 要排序的数组
	 * @param  integer $pid 从哪里开始，默认是0，顶级开始
	 * @param  integer $level 表示层级，默认是0，顶级
	 * @return array     排好序的数组
	 */
	/*
	public function tree($arr,$pid = 0,$level = 0){
		static $res = array();
		foreach ($arr as $v) {
			if ($v['parent_id'] == $pid) {
				//说明找到，保存起来
				//首先，需要将level保存到当前分类中
				$v['level'] = $level;
				$res[] = $v;
				//继续查找，递归，条件发生变化
				$this->tree($arr,$v['cat_id'],$level+1);
			}
		}
		//返回结果
		return $res;
	}
	*/
	//tree方法的完美版本
	public function tree($arr,$pid = 0,$level = 0){
		$res = array();
		foreach ($arr as $v) {
			if ($v['parent_id'] == $pid) {
				$v['level'] = $level;//如果找到了就给$v加一个level
									//并且马上根据他的cat_id找他的孩子
				$child = $this->tree($arr,$v['cat_id'],$level+1);
				$res[] = $v;//把这一项放在是为了使用array_merge功能
				$res = array_merge($res,$child);

			}
		}
		//返回结果
		return $res;
	}

	
	//获取指定分类下的所有后代分类的cat_id, 也包括它自己
	public function getSubIds($cat_id){
		$sql = "SELECT * FROM {$this->table}";
		$cats = $this->db->getAll($sql);
		$cats = $this->tree($cats,$cat_id); //二维数组
		$ids = array();
		foreach ($cats as $v) {
			$ids[] = $v['cat_id'];
		}
		//将自己也追加到$ids中
		$ids[] = $cat_id;
		//返回结果
		return $ids;
	}
	/**
	 * 构造具备包含关系的多维数组
	 * @param  array  $arr 需要处理的数组
	 * @param  integer $pid 条件，从哪里开始，默认为0，从顶级分类开始
	 * @return array   多维数组
	 */
	public function child($arr,$pid = 0){
		$res = array();
		foreach ($arr as $v) {
			//需要判断
			if ($v['parent_id'] == $pid) {
				//说明找到，递归继续找
				$childs = $this->child($arr,$v['cat_id']);
				//将找到的结果，作为当前分类的数组元素来保存，下标为child
				$v['child'] = $childs;
				$res[] = $v;
			}
		}
		return $res;
	}

	//前台首页获取分类
	public function frontCats(){
		$sql = "SELECT * FROM {$this->table}";
		$cats = $this->db->getAll($sql);
		return $this->child($cats);
	}
}